package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql" // 匿名导入
)

func main() {
	// user:password@tcp(主机:3306)/dbname
	// 设置连接的参数
	dsn := "root:123456@tcp(192.168.88.11:3306)/tedu"
	// 创建MySQL连接对象
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		log.Fatal(err)
	}
	// 在退出之前
	defer db.Close()
	// 连接池
	db.SetConnMaxLifetime(time.Minute * 3) // 连接的最大生命周期
	db.SetMaxIdleConns(5)                  // 最大闲置连接数
	db.SetMaxOpenConns(10)                 // 最大连接数
	// 建立连接
	err = db.Ping()
	if err != nil {
		log.Fatal("连接失败：", err)
	}
	// fmt.Println("连接成功")

	/*
			// 1.插入数据
			// sql_insert := "insert into user(name, age) values('小红', 20)"
			// result, err := db.Exec(sql_insert)
			// 使用模板形式  ?  占位符
			sql_insert := "insert into user(name, age) values(?, ?)"
			result, err := db.Exec(sql_insert, "小军", 19)

			if err != nil {
				log.Fatal(err)
			}
			// 通过成功的结果查看插入的ID
			lastId, _ := result.LastInsertId()
			rows, _ := result.RowsAffected()
			fmt.Println("插入的ID：", lastId)
			fmt.Println("影响的行数：", rows)

			// 2.查询数据
			// 查询到的数据格式为一个字段
			var name string
			sql_select := "select name from user where id=?"
			// 执行单行查询
			result := db.QueryRow(sql_select, 1)
			// 将查询的数据绑定到变量
			result.Scan(&name)
			fmt.Println(name)

			// 结构体类型，可以保存多个字段
			type User struct {
				id   int
				name string
				age  int
			}
			var user User
			sql_select := "select id,name,age from user where id=?"
			// 执行单行查询
			result := db.QueryRow(sql_select, 1)
			// 将查询的数据绑定给结构体
			result.Scan(&user.id, &user.name, &user.age)
			fmt.Println(user)

			// 3.查询多行数据
			type User struct {
				id   int
				name string
				age  int
			}
			sql_select := "select id,name,age from user where age > ?"
			rows, err := db.Query(sql_select, 19)
			if err != nil {
				log.Fatal(err)
			}
			// fmt.Println(rows)
			users := make([]User, 0, 3) // 创建切片，保存每条数据
			// 循环读取结果集中的数据
			for rows.Next() {
				var user User // 定义结构体变量，保存每条数据
				rows.Scan(&user.id, &user.name, &user.age)
				// fmt.Println(user)
				users = append(users, user) // 将每一条数据放入到切片
			}
			fmt.Println(users)

			// 4.修改数据
			sql_update := "update user set name=?, age=? where id=?"
			result, err := db.Exec(sql_update, "黄晓明", 48, 1)
			if err != nil {
				log.Fatal(err)
			}
			// 影响到的行数
			row, _ := result.RowsAffected()
			fmt.Println("影响的行数：", row)

		// 5.删除数据
		sql_delete := "delete from user where id=?"
		result, err := db.Exec(sql_delete, 3)
		if err != nil {
			log.Fatal(err)
		}
		row, _ := result.RowsAffected()
		fmt.Println("删除受影响的行数：", row)
	*/
	id := "1 or 1=1"
	// sql := fmt.Sprintf("select id,name,age from user where id=%s", id)
	sql := "select id,name,age from user where id=?"
	// 使用?，就会对提供的值进行过滤，过滤再替换占位符
	rows, _ := db.Query(sql, id)

	for rows.Next() {
		fmt.Println("取出了1条")
	}

}
